深入解读 SOMEIP 协议

#Technomous #SOMEIP

Pasted image 20230718174405.png|650

SOME/IP 是一种用于控制消息的汽车中间件解决方案。它从一开始就被设计为完美适配不同尺寸和不同操作系统的设备,包括像摄像头、AUTOSAR 设备、头部单元或遥测设备等小型设备。同时,确保 SOME/IP 支持信息娱乐领域以及车辆中的其他领域的功能,使得 SOME/IP 可以用于 MOST 替代方案以及更传统的 CAN 方案。

SOME/IP 支持的中间件功能:

下面就来看一下这些功能解决了哪些问题:

服务化中间件

Pasted image 20231120175043.png|450

SOME/IP 是一种面向服务(SOA)的中间件实现方案。面向服务是一个组件化的模型,它将应用程序的不同功能单元(服务)通过良好的接口和契约联系起来。其中,服务(Service)是一个粗颗粒度的、可发现的软件实体,以一个单独的实例存在,通过一组耦合和基于消息的模型与其他应用或服务交互。接口是采用中立的方式进行定义的,独立于实现服务的硬件平台、操作系统和编程语言,使得构建在这样的系统中的服务可以以一种统一和通用的方式进行交互。

交互的服务大致由三个实体组成:服务请求者、服务提供者和服务注册表。其中实体间的操作包括:服务发布、服务发现、服务绑定和调用。

面向服务的架构是众多软件架构中的一种。因面向服务架构风格具有基于标准、松散耦合、共享服务和粗粒度等优势,表现出易于集成现有系统、具有标准化的架构、提高开发效率、降低开发维护复杂度等特征,更符合智能网联化时代车载系统对软件架构的要求,所以被汽车行业引入和采用。

协议交互流程

Pasted image 20230831160926.png|500

下面我们从两个方面来理解 SOME/IP 协议的内容,通信方式和报文格式。SOME/IP-SD 协议其实是 SOME/IP 的子协议,它与 SOME/IP 协议共用了报文头的格式。所以当我们提到 SOME/IP 协议的时候其实也包含了 SOME/IP-SD 协议部分。

SOME/IP 协议的交互流程包含两个重要的部分:

SOME/IP 的协议交互流程包含两个阶段,首先是 SOME/IP-SD 模块、然后才是 SOME/IP 模块。SOME/IP-SD 模块的交互包含发布/订阅(publish/subscribe)过程,SOME/IP 模块的交互包含请求/响应(request/response)和通知(Notification)过程。发布是实现服务发现的必要过程,而订阅是为了实现 SOME/IP 模块的通知过程。正如上图所示,首先是 Server 端通过 SOME/IP-SD 模块发布了服务,即 OfferService,然后 Client 端通过 SOME/IP-SD 模块订阅了服务,即 SubscribeEventGroup。后面进入到了 SOME/IP 模块的交互,即 Request 和 Response,还有 Event。值得注意的是为什么 Event 并没有交互过程,仅仅是 Server 端主动发送给 Client 端呢?这是是因为前面的 SubscribeEventGroup 过程已经实现 Event 的订阅,后面 Server 一直周期发送给 Client 即可,这个对应了传统信号交互方式下的周期报文。

SOME/IP 协议可以使用 TCP/UDP 作为传输层协议。从上图的交互过程中可以看到在 SOME/IP-SD 阶段提供服务之后,会有 TCP 协议的握手交互。在 SOME/IP 阶段的交互中会有 UDP 和 TCP 协议的初始化过程。

SOME/IP 通信阶段可以基于延时要求选择使用 TCP 协议或者 UDP 协议。需要注意的是一个 UDP 包的大小不能超过(1400 字节)。使用 UDP 协议传输小型报文的时候,为了提高效率会将多个报文会放在一个 UDP 包里。使用 UDP 协议传输大型报文的时候,就需要使用 UDP 协议的 SOME/IP-TP 协议。

协议服务接口

SOA 理念中服务之间是通过接口的方式进行交互的,SOME/IP 作为一种 SOA 中间件,也有自己的服务接口,分别是 Method、Event、Field 三种类型。三种接口类型在协议交互过程中的应用如下图所示。

协议报文格式

Pasted image 20230628144134.png|650

如上图所示,SOME/IP 消息包含两个部分:Header 和 Payload。

SOME/IP Header

Pasted image 20230901132646.png|650

Header 的长度为 16 字节,Payload 的长度是可变的。Header 部分由分为前 8 个字节(粉色部分)和后 8 个字节(绿色部分)。在 CP 架构中,绿色部分是由 SomeIpXf 模块封装或解析的,粉色部分由 SoAd 封装或解析。下面分别对 Header 的各个字段进行详细讲解。

SOME/IP Payload

Payload 就是上层业务需要传输的有效数据。很多时候还需要做一些功能安全的通信,需要用到 E2E 保护,那么 E2E 的格式头也是在 Payload 里面,如下图所示。

Pasted image 20230901140609.png|650

SOME/IP-SD

Pasted image 20230831162258.png|650

SOME/IP-SD 报文也是一种 SOME/IP 报文,是在 SOME/IP 报文的基础上进行了扩展,增加了 Entry、Option 等字段,Entries 用于同步服务实例的状态和发布/订阅的管理,Options 用于传输 Entries 的附加信息。

SOME/IP-SD Header

SOME/IP-SD Payload

SOME/IP-SD Entry

Entry 的类型包含下表 7 种类型。

Pasted image 20230703172618.png|550

Entry 按照类型的格式可以分为两种:Entry Type 1:服务类型(Service Entry Type)和 Entry Type 2:事件组类型(EventGroup Entry Type)。对于服务发布而言,一般仅需要 Offer/Stop Offer 就足够了,按时为了快速激活服务,还可以使用 Find 去主动寻找。对于事件订阅而言,需要使用 Subscribe/Stop Subscribe 和 Subscribe Ack/Nack。

SOME/IP-SD Option

种类 作用
IPv4 Endpoint Option 本地业务的 IP 和 Port 信息,通过 SD 报文发送给对方,对方收到该信息后,才知道该往哪里传输(比如,Offer 中可以携带 Server 的 IP 和 Port,Client 收到 Offer 后,才知道往哪里发送 Request 报文,携带 IP 和 Port,也促使 Server 的动态部署能力)
IPv6 Endpoint Option 同上
IPv4 Muticast Option 同上
IPv6 Multicast Option 同上
IPv4 SD Endpoint Option SD Endpoint Option 与上面的 Option 最大的区别就是其携带的是 SD 的 IP 和 Port,而不是业务的 IP 和 Port。大家肯定会疑惑 SD 报文在 IP 层不是有 IP 和 Port 信息吗?为什么 SD 报文里还要再携带一次呢、那是因为有时候在网络拓扑上,发送服务发现组播报文的 ECU 和服务所在的 ECU 可能不是一个,从而导致发送订阅报文给了错误的 ECU(该场景很少出现,因此 SD Endpoint Option 也很少使用)。需要注意的一点是,如果使用了 SD Endpoint Option,那么协议要求其一定要放在所有 Option 首位。
IPv6 SD Endpoint Option 同上
Configuration Option 一般来说就是自定义 Option,用户可以通过发送字符串的形式携带信息。
Load Balancing Option 意义不大,AUTOSAR CP 里直接把这个 Option 删除了。

Option 包含的种类如上图所示。Option 用来辅助 Entry 实现其功能,是 Entry 携带的附加信息。一般是用来告诉对端自己的业务的 IP 和 Port 信息,方便对端通过相应的 IP 和 Port 来发送报文。除了 SOME/IP-SD Endpoint Option 不与任何 Entry 关联,但是其他的 Option 一定是与某个 Entry 关联,否则就不会存在。各类 Entry 所能关联的 Option 也是有要求的,如下图所示。

Pasted image 20230831180201.png|450

协议规范文档

Pasted image 20230619113046.png|650

SOME/IP 协议目标分为两个版本:GENIVI 和 AUTOSAR 两个部分。需要注意的是,AUTOSAR 中的专有功能并不是每个实现都会包含。具体信息可以到 SOME/IP官网查看。

AUTOSAR 的 SOME/IP 协议包含以下部分:

GENIVI 的 SOME/IP 协议包含以下部分: